因為Http是無狀態的,我們可以利用session讓使用者表明自己的身份。
首先我們必須先建立一個session的table
php artisan session:table
php artisan migrate
這時在我們的資料庫里面,會出現一個session的表格
這時我們來看看能不能再登入後保持session,所以我們在loginController中,登入後存session
public function loginWithORM(Request $request){
$account = $request->input('account');
$password = $request->input('password');
$user = User::query()
->where('account', $account)
->first();
if(Hash::check($password, $user->password)){
session(['user' => $user]);
return "你好,我的帳號是".$user->account;
}
return Redirect::back()->withErrors(['帳號或密碼錯誤']);
}
我們這時候在寫一個nav.blade.php去確認我們的session狀態如何,並讓welcome.blade.php include
@if(!Session::has('user'))
<div style="float:right;">
<a href="login">登入</a>
</div>
@endif
@if(Session::has('user'))
<div style="float:right;">
<span>你好,{{ Session::get('user.name') }}</span>
<a href="logout">登出</a>
</div>
@endif
同時,我們把welcome.blade.php改寫成我們的首頁
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Laravel</title>
</head>
<body>
@include('nav')
<h1>我是首頁</h1>
</body>
</html>
controller在登入成功後,我們讓他導入首頁
public function loginWithORM(Request $request){
$account = $request->input('account');
$password = $request->input('password');
$user = User::query()
->where('account', $account)
->first();
if(Hash::check($password, $user->password)){
session(['user' => $user]);
return view('welcome');
}
return Redirect::back()->withErrors(['帳號或密碼錯誤']);
}
好的!登入測試看看,首先我們進入首頁,會看到這個畫面
按下登入後,導到登入畫面,我們打完正確的帳密後,按下登入,畫面回到首頁長這樣
成功取得session的值,這時候不管重整畫面還是關掉重開,session都會保持住,但我們在登出時,會希望他的session被拿掉,所以我們要做一個登出的controller,記得要加上route唷!
class LogoutController extends Controller{
public function __invoke(Request $request)
{
$request->session()->flush();
return view('welcome');
}
}
試試登出吧,這時登出session就被消除了!我們今天完成了session保持狀態,明天見囉~